#ifndef ELEMENTO_UI_H
#define ELEMENTO_UI_H

#include <glib.h>
#include <gtk/gtk.h>

class Elemento_ui
{
    public:
      /** Costruttore di default */
      Elemento_ui();
      
      /** Distruttore di default */
      virtual ~Elemento_ui();
      
      /** Coordinata X
      * @return La coordinata X 
      */
      gdouble get_x() { return x; }
      
      /** Imposta la coordinata X
      * @param[in] val Nuovo valore della coordinata X
      */
      void set_x(gdouble val) { x = val; }
      
      /** Coordinata Y
      * @return La coordinata Y
      */
      gdouble get_y() { return y; }
      
      /** Imposta la coordinata Y
      * @param[in] val Nuovo valore della coordinata Y
      */
      void set_y(gdouble val) { y = val; }
      
      /** Stato di selezione dell'oggetto.
      * Se è stato selezionato ritorna TRUE, FALSE altrimenti
      * @return Lo stato di selezione dell'oggetto
      */
      gboolean is_selected() { return selected; }
      
      /** Imposta lo stato di selezione
      * @param[in] val Il nuovo stato di selezione dell'oggetto
      */
      void set_selected(gboolean val) { selected = val; }
      
      /** Ritorna se l'oggetto si trova sotto il mouse
      * @return TRUE se si trova sotto il mouse, FALSE altrimenti
      */
      gboolean is_over() { return over; }
      
      /** Imposta lo stato di over
      * @param[in] val Il nuovo stato di over
      */
      void set_over(gboolean val) { over = val; }
      
      /** Imposta lo stato di over in base alle coordinate.
      * Se l'oggetto si trova sotto alle coordinate specificate, allora è in over
      * @param[in] x Coordinata X
      * @param[in] y Coordinata Y
      */
      void set_over(gdouble x, gdouble y);
      
      /** Disegna l'oggetto.
      * @param[in] cr puntatore all'oggetto Cairo        
      */
      virtual void draw(cairo_t* &cr);
      
      /** Aggiorna lo stato dell'oggetto.
      * Questa funzione viene chiamata ad ogni evento del mouse, in modo che ogni oggetto possa aggiornarsi.
      * @param[in] x La coordinata X corrente del mouse
      * @param[in] y La coordinata Y corrente del mouse
      */
      virtual void update(gdouble x, gdouble y);
      
      /** Controlla eventuali collisioni.
      * Controlla se le coordinate del punto passato rientrano all'interno dell'area 
      * occupata dall'elemento corrente.
      * @param[in] x La coordinata X del punto da controllare
      * @param[in] y La coordinata Y del punto da controllare
      * @return True se il punto fa parte dell'elemento corrente, False altrimenti.
      */
      virtual gboolean intersect(gdouble x, gdouble y);         
    protected:
        gdouble x; //!< Coordinata X dell'oggetto
        gdouble y; //!< Coordinata Y dell'oggetto
        gboolean selected; //!< Indica se l'oggetto è stato selezionato
        gboolean over; //!< Indica se il mouse si trova sopra all'oggetto

    private:
};

#endif // IELEMENTOUI_H
